package com.qzl.common.netty.utis;

import cn.hutool.json.JSONUtil;
import com.qzl.common.netty.config.ProtocolConstants;
import com.qzl.common.netty.message.Message;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import io.netty.util.AttributeKey;
import lombok.extern.slf4j.Slf4j;

/**
 * @author: qzl
 * @date : 2025/6/24 15:57
 * @description:
 */
@Slf4j
public class ResponseUtils {
    /**
     *  当前handler可以向下传递
     * @param ctx
     * @param message
     */
    public static void sendCtxResponse(ChannelHandlerContext ctx, Message message) {
        Object protocolType = ctx.channel().attr(AttributeKey.valueOf(ProtocolConstants.PROTOCOL_KEY)).get();
        Integer typeInteger = Integer.valueOf(protocolType.toString());
        if (typeInteger == ProtocolConstants.PROTOCOL_WEBSOCKET) {
            String json = JSONUtil.toJsonStr(message);
            ctx.writeAndFlush(new TextWebSocketFrame(json))
                    .addListener(future -> {
                        if (!future.isSuccess()) {
                            log.error("websocket发送失败", future.cause());
                        }
                    });
        } else {
            ctx.writeAndFlush(message)
                    .addListener(future -> {
                        if (!future.isSuccess()) {
                            log.error("TCP发送失败", future.cause());
                        }
                    }); // 自定义 TCP 编码器会自动转换
        }
    }

    /** 直接从最后一个handler向上传递
     */
    public static void sendChannelResponse(ChannelHandlerContext ctx, Message message) {
        Object protocolType = ctx.channel().attr(AttributeKey.valueOf(ProtocolConstants.PROTOCOL_KEY)).get();
        Integer typeInteger = Integer.valueOf(protocolType.toString());
        if (typeInteger == ProtocolConstants.PROTOCOL_WEBSOCKET) {
            String json = JSONUtil.toJsonStr(message);
            ctx.channel().writeAndFlush(new TextWebSocketFrame(json));
        } else {
            ctx.channel().writeAndFlush(message); // 自定义 TCP 编码器会自动转换
        }
    }
}

